在前面其實我有提到我的一個小目標是在雲端上能夠使用,我在本地包好的docker,以下是我實作及遇到的問題:
目標:可以將自己的image上傳到docker hub
首先可以先看看自己有什麼image
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wadedeilee/mylaravelapp pokemon 62e7b1eda7a9 2 days ago 1.05GB
sail-8.2/app latest 62e7b1eda7a9 2 days ago 1.05GB
mysql latest 3503aa5f0751 4 days ago 599MB
mysql/mysql-server 8.0 423da140c8c0 8 months ago 507MB
註冊docker Hub帳戶:
確保您已擁有一個Docker Hub帳戶。如果還沒有,您需要先註冊一個帳戶。
在本地機器上,使用命令行工具登入Docker Hub:它會要求您輸入您的Docker Hub用戶名和密碼。
docker login
接著將他push到docker hub
docker push wadedeilee/mylaravelapp:pokemon
docker push [USERNAME]/[REPOSITORY]:[TAG]
確認是否在docker hub上面看到鏡像黨
有看到鏡像黨
目標三:在雲端主機上,可以使用打包好的環境,直接運行專案,讓專案順利運行
開一個ec2雲端主機,下載git :
apt-get update
apt-get install git
從github上clone資料下來,再從docker
下載docker 及 composer
如何將image 拉下來
docker pull wadedeilee/mylaravelapp:pokemon
我在我的雲端將容器打開, 但出現Exit 1
sudo docker-compose up -d
WARNING: The PWD variable is not set. Defaulting to a blank string.
Recreating pokemonprojectgold_mysql_1 ... done
Recreating pokemonprojectgold_laravel.test_1 ... done
sudo docker-compose ps
Name Command State Ports
pokemonprojectgold_laravel.test_1 start-container Exit 1
pokemonprojectgold_mysql_1 /entrypoint.sh mysqld Exit 1
於是我去看了日誌:
Attaching to pokemonprojectgold_laravel.test_1
laravel.test_1 | exec /usr/local/bin/start-container: exec format error
Attaching to pokemonprojectgold_mysql_1
mysql_1 | [Entrypoint] MySQL Docker Image 8.0.32-1.2.11-server
mysql_1 | [Entrypoint] Starting MySQL 8.0.32-1.2.11-server
mysql_1 | 2023-09-26T14:01:37.135381Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
第一個問題:
laravel.test_1 exec format error。這個可能是由於start container的腳本出現問題
後來去查可能是因為處理器架構問題,我本地是**arm64,**雲端虛擬主機我是開ubuntu 他是x86。
所以由於這兩種架構具有完全不同的指令集和二進制接口。當程序或操作系統被編譯成二進制格式時,它是基於特定的硬體架構和其相應的指令集。
也就是我在本地編譯的檔案在x86可能會不能執行。
解決方法:
buildx
的插件,它可以建立跨多個平台的映像。使用 buildx
,您可以在單一機器上為多個目標架構(例如 arm64
和 x86_64
)建構映像。這裡我查到最直接的方法就是用ubuntu的系統去建,
但我目前想說不然我先在雲端主機上先用別人的image跑看看,看會不會有什麼問題
第二個問題:
每次創建完容器,ec2都會跑不太動,而且重新連線也連不上,我還去看了防火牆的設定。
但在前輩的提示下,可能是因為我開的ec2是免費方案硬體設備可能不是很頂,所以記憶體有可能會不夠。
後來我嘗試使用了swap看能不能解決問題
使用swap
什麼事swap
如果 RAM 空間滿了,Swap 會將不常用的應用移至硬碟,釋放 RAM 空間,讓新的應用可以進到 RAM
创建 Swap 文件
使用以下命令创建一个大小为 1GB 的 swap 文件:
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
设置合适的权限
为了确保只有 root 用户可以读写 swap 文件,设置正确的权限:
sudo chmod 600 /swapfile
格式化为 Swap
使用 mkswap
工具来格式化刚刚创建的文件为 swap 文件:
sudo mkswap /swapfile
激活 Swap 文件
使用 swapon
命令来激活 swap 文件:
sudo swapon /swapfile
如果你想在每次系统启动时都自动启用这个 swap 文件,你需要将其添加到 /etc/fstab
文件中:
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
查看 Swap 是否已启用
使用 free
命令来查看当前的内存和 swap 使用情况:
free -m
total used free shared buff/cache available
Mem: 949 577 69 18 302 193
Swap: 1023 0 1023
後來再開啟容器就沒有延遲問題了。
關於docker的使用還有太多要學習,我這裡真的都只是新手初探而已,只是記錄一下使用過踩到的坑,讓剛用的新手包括我自己在未來遇到同樣的問題時可以有一點想法,